; (function () {
    // return
    /**
   * @param {number[]} nums
   * @return {number[][]}
   */
    var threeSum = function (nums) {
        nums.sort((a, b) => a - b);
        let _length = nums.length;
        let arr = []
        for (let index = 0; index < _length; index++) {
            if (nums[index] > 0) break; // 如果当前数字大于0，则三数之和一定大于0，所以结束循环
            if (index > 0 && nums[index] == nums[index - 1]) continue; // 去重
            const element = 0 - nums[index];

            let numset = {};

            for (let i = index + 1; i < _length; i++) {
                if (numset[element - nums[i]] != undefined) {
                    let o = [nums[index], nums[numset[element - nums[i]]], nums[i]];
                    arr.push(o);
                }
                else
                    numset[nums[i]] = i;
            }

        }
        function removeDuplicateSubarrays(array) {
            const uniqueArray = [];
            const seen = new Set();

            for (const subarray of array) {
                // 将子数组转换为字符串，以保持顺序不变  
                subarray.sort((a, b) => a - b)
                const key = subarray.join('|');
                if (!seen.has(key)) {
                    seen.add(key);
                    uniqueArray.push(subarray);
                }
            }

            return uniqueArray;
        }
        console.log(arr);
        return removeDuplicateSubarrays(arr)
    };
    console.log(threeSum([-1, 0, 1, 2, -1, -4]));


})();

// 最优解
; (function () {
    //return
    /**
  * @param {number[]} nums
  * @return {number[][]}
  */
    var threeSum = function (nums) {
        const result = []
        let left, right
        // 升序排列
        nums.sort((v1, v2) => v1 - v2)
        for (let i = 0; i < nums.length - 2; i++) {
            if (nums[i] > 0) break;
            if (i > 0 && nums[i] == nums[i - 1]) continue // 第一位相同，去除
            left = i + 1
            right = nums.length - 1
            while (left < right) {
                let sum = nums[i] + nums[left] + nums[right]
                if (sum > 0) {
                    // 因为rigth是大值,只好减少大值
                    right--
                } else if (sum < 0) {
                    // 不够时只能增加小值, 减小大值那会更加不够
                    left++
                } else {
                    result.push([nums[i], nums[left], nums[right]])
                    // 这里去重重复的数字没必要再比较了
                    while (left < right && nums[left] == nums[left + 1]) left++
                    while (left < right && nums[right] == nums[right - 1]) right--

                    // 用过的数字没必要再用了.比如-5和5等于0, 那么-5和5不可能和其他数等于0了
                    right--
                    left++
                }
            }
        }
        return result
    };

})();